class Solution {
public:
    vector<int> partitionLabels(string s) {
        // 这道题目其实就是一个合并区间的题目，题目的意思如下，假设一个字符串s，其中a在这个字符串s中的出现范围为
        // [0,a],而b在这个字符串中的出现范围为[c,d]，如果这两个区间能够合并，代表着两个字母可以划分在一个区间
        // 所以为了解决这个题目，首先我要知道每一个字符在字符串中出现的最后的距离下标是多少
        // 然后使用start和end表示我当前的合并范围，对于字符串i首先要获得这个字符出现的最后的下标
        // 然后使用这个下标来更新end，因为我们是在遍历原字符串的，如果发现遍历原字符串的那个下标的值等于了end
        // 因为end只会选择所有可以出现在这个区间中出现最晚的字符，而如果i == end，说明这一个区间已经合并完成了
        // 应该去合并下一个区间了
        int start = 0;
        int end = 0;
        int loc[26] = {0};
        for(int i = 0;i<s.size();i++)
        {
            loc[s[i]-'a'] = i;//得到这个字符出现的最晚的位置
        }
        vector<int> ret;
        for(int i = 0;i<s.size();i++)
        {
            end = max(end,loc[s[i]-'a']);
            if(end == i)
            {
                //当前区间已经合并完成了
                ret.push_back(i-start+1);
                start = i+1;//从下一个区间开始继续合并
            }
        }
        return ret;
    }
};